// startimes

// MARK: - adm

// 开屏广告
// "/adm/v1/negotiator/ad/fullscreen"
// LiveTV admob广告
// "/adm/v1/negotiator/live-tv"

// 浮窗广告 - 全局列表
// "/adm/v1/negotiator/ad/video/floating-icon-banner"
// 浮窗广告 - 播放器内
// "/adm/v1/negotiator/ad/video/floating-player"

// 插页广告
// "/adm/v1/negotiator/ad/insert-ads"
// 激励广告
// "/adm/v1/negotiator/reward-ads"

// 广告上报
// "/adm/v1/negotiator/ads/report"

// 赛事 banner
// "/adm/v1/units/\(uuid)/materials"

// 暂停广告
// "/adm/v1/negotiator/ad/popup"
// 赛事广告
// "/adm/v1/negotiator/ad/sport"


// MARK: - ums

// ME 个人信息
// "/ums/v1/user/me"
// 注销后再次登录获取是否有过注销
// "/ums/v1/cancellation/info"

// MARK: - cpage

// 所有频道数据: 登录后获取
// /cpage/v1/channel-categories-with-channels
// 播放详情Tabs 数组
// /cpage/v1/video/detail/page/tab

// MARK: - 请求接口命名
enum STTestApi {
    
    /** post 请求 */
    case testPost(parameter: Any)
    
    /** get 请求 */
    case testGet(parameter: Any)
    
    /** post + get 请求 */
    case testPostGet(parameter: Any)
    
    /** selecte 请求 */
    case selectUser
    
    /** selecte 请求 */
    case selectUsers
    
    /** update 请求 */
    case updateUser

    /** delete 请求 */
    case deleteUser
}

// MARK: - 请求接口实现
extension STTestApi: TargetType {
    
    /// 单元测试数据(可以忽略)
    /// var sampleData: Data { get }
    
    /// 是否执行Alamofire验证(可以忽略)
    /// var validationType: ValidationType { get }
    
    // MARK: api 服务器地址 host
    var baseURL: URL { return URL(string: BASE_URL) }
    
    /// 请求头
    var headers: [String: String]? {
        return [:]
    }
       
    // MARK: api 地址路径
    var path: String {
        switch self {
        case .testPost(_):
            return "/test/postPath"
        case .testGet(_):
            return "/test/getPath"
        case .testPostGet(_):
            return "/test/post_getPath"
        case .selectUser:
            return "/test/selectUser"
        case .selectUsers:
            return "/test/selectUsers"
        case .updateUser:
            return "/test/updateUser"
        case .deleteUser:
            return "/test/deleteUser"
        }
    }
    
    var parameters: [String : Any]? {
        switch self {
        case let .testPost(parameter):
            var parameters = [String: Any]()
            parameters["parameter"] = parameter
            return parameters
        case let .testGet(parameter):
            var parameters = [String: Any]()
            parameters["parameter"] = parameter
            return parameters
        case let .testPostGet(parameter):
            var parameters = [String: Any]()
            parameters["parameter"] = parameter
            return parameters
        default:
            return nil
        }
    }
    
    var queries: [String : Any] {
        switch self {
        case let .testPostGet(parameter):
            var parameters = [String: Any]()
            parameters["parameter"] = parameter
            return parameters
        default:
            return [:]
        }
    }
    
    // MARK: api 地址路径
    var method: Moya.Method {
        switch self {
        case .testPost, .testPostGet:
            return .post
        case .updateUser:
            return .put
        case .deleteUser:
            return .delete
        default:
            return .get
        }
    }
    
    var paramsEncoding: ParameterEncoding {
        switch self {
        case .testPost, .testPostGet, .updateUser, .deleteUser:
            return JSONEncoding.default
        default:
            return URLEncoding.default
        }
    }
    
    /// 执行任务
    var task: Task {
        guard let params = parameters else { return .requestPlain }
        
        switch self {
        case .testPostGet:
            // post + get 参数
            return .requestCompositeParameters(bodyParameters: params,
                                               bodyEncoding: paramsEncoding,
                                               urlParameters: queries)
        default:
            return .requestParameters(parameters: params, encoding: paramsEncoding)
        }
    }
}

/// Represents an HTTP task.
public enum Task {
    // MARK: 常用
    
    // MARK: 无参
    case requestPlain
    // MARK: 继承Encodable协议参数, Form表单 编码
    case requestData(Data)
    // MARK: 继承Encodable协议参数, JSON 编码
    case requestJSONEncodable(Encodable)
    
    // MARK: 继承Encodable协议参数, 自定义 JSON 编码
    case requestCustomJSONEncodable(Encodable, encoder: JSONEncoder)
    
    // MARK: (body / query)参数
    /**
     * 1. URLEncoding: (form 表单)
     -    httpMethod:
     -      1.1 GET: query
     -      1.2 Other: body
     * 2. JSONEncoding: (body json)
     */
    case requestParameters(parameters: [String: Any], encoding: ParameterEncoding)
    
    // MARK: (body + query)组合参数
    /// (body + query)组合参数 (编码: 默认, form 表单)
    case requestCompositeData(bodyData: Data, urlParameters: [String: Any])
    /// (body + query)组合参数, body编码格式: bodyEncoding
    case requestCompositeParameters(bodyParameters: [String: Any], bodyEncoding: ParameterEncoding, urlParameters: [String: Any])
    
    // MARK: 不常用
    /// 文件上载任务。
    case uploadFile(URL)
    /// A "multipart/form-data" upload task.
    case uploadMultipart([MultipartFormData])
    /// A "multipart/form-data" upload task  结合url参数。
    case uploadCompositeMultipart([MultipartFormData], urlParameters: [String: Any])
    /// 到目的地的文件下载任务。
    case downloadDestination(DownloadDestination)
    /// 使用给定编码的具有额外参数的目标的文件下载任务。
    case downloadParameters(parameters: [String: Any], encoding: ParameterEncoding, destination: DownloadDestination)
}
